package com.wei.czz.framework.game.controller;

import java.util.List;

import com.wei.czz.common.annotation.Auth;
import com.wei.czz.common.annotation.Resubmit;
import com.wei.czz.common.dto.game.GameDto;
import com.wei.czz.common.enums.CommonEnum;
import com.wei.czz.common.jsr303.group.OrderSearch;
import com.wei.czz.common.tool.PageDto;
import com.wei.czz.common.tool.Result;
import com.wei.czz.common.utils.SecurityUtils;
import com.wei.czz.common.vo.common.UpdateStatusVo;
import com.wei.czz.common.vo.game.DefaultPrizeVo;
import com.wei.czz.common.vo.game.GameFormVo;
import com.wei.czz.common.vo.game.GameVo;
import com.wei.czz.framework.game.helper.GameHelper;
import lombok.AllArgsConstructor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import com.wei.czz.framework.game.service.GameService;

import javax.servlet.http.HttpServletResponse;

/**
 * Created by IntelliJ IDEA.
 *
 * @author wei
 * date: 2023-03-16 11:35:49
 * className: GameController 游戏请求接口类
 * version: 1.0
 * description:
 */
@RestController
@RequestMapping("/game")
@AllArgsConstructor
public class GameController {

    private static final Logger log = LoggerFactory.getLogger(GameController.class);

    private final GameService gameService;

    private final GameHelper gameHelper;

    /**
     * 保存游戏接口
     * <p>
     * 调用方：
     *  1、浏览器-后台管理页-游戏管理页-游戏添加/修改弹出框调用
     * <p>
     * 此接口会校验是否重复提交
     * @param gameVo 游戏参数对象
     */
    @Resubmit(message = "保存游戏")
    @PostMapping("/save")
    @Auth(permit = "game:save")
    public Result<Object> saveGame(@RequestBody GameVo gameVo){
        log.info("开始保存游戏业务。{}", gameVo);
        if (gameVo.isSaveParamsFail()) {
            log.info("保存游戏接口，请求参数错误");
            return Result.paramFail();
        }

        gameService.saveGame(gameVo);

        log.info("保存游戏业务结束");
        return Result.success();
    }

    /**
     * 设置游戏默认奖品接口
     * <p>
     * 调用方：
     *  1、浏览器-后台管理页-游戏奖品管理页调用
     * <p>
     * 此接口会校验是否重复提交
     * @param defaultPrizeVo 参数对象
     */
    @Resubmit(message = "设置游戏默认奖品")
    @PostMapping("/save/defaultPrize")
    @Auth(permit = "game:save")
    public Result<Object> saveDefaultPrize(@RequestBody DefaultPrizeVo defaultPrizeVo) {
        log.info("开始设置游戏默认奖品业务。{}", defaultPrizeVo);
        if (defaultPrizeVo.isSaveParamFail()) {
            log.info("设置游戏默认奖品接口，请求参数错误");
            return Result.paramFail();
        }

        gameService.updateDefaultPrize(defaultPrizeVo.getGameId(), defaultPrizeVo.getPrizeId(),
                defaultPrizeVo.getOldPrizeId(), SecurityUtils.getUserId());

        log.info("设置游戏默认奖品业务结束");
        return Result.success();
    }

    /**
     * 分页获取游戏接口
     * <p>
     * 调用方：
     *  1、浏览器-后台管理页-游戏管理页调用
     *
     * @param gameFormVo 参数对象
     * @return 游戏数据
     */
    @PostMapping("/page/list")
    @Auth(permit = "game:list")
    public Result<PageDto<GameDto>> pageGameList(@Validated(OrderSearch.class) @RequestBody GameFormVo gameFormVo) {
        log.info("开始分页获取游戏业务。{}", gameFormVo);

        PageDto<GameDto> pageDto = gameService.getGamePageList(gameFormVo);

        log.info("分页获取游戏业务结束");
        return Result.success(pageDto);
    }

    /**
     * 游戏导出接口
     * <p>
     * 调用方：
     *  1、浏览器-后台管理页-游戏管理页调用
     * @param taskId   导出任务主键
     * @param response http响应对象
     * @return 结果
     */
    @GetMapping("/export")
    public Result<Object> gameExport(@RequestParam("taskId") Long taskId, HttpServletResponse response) {
        log.info("开始游戏导出业务。taskId={}", taskId);

        gameHelper.exportGame(taskId, response);

        log.info("开始游戏导出业务");
        return null;
    }

    /**
     * 修改游戏接口
     * <p>
     * 调用方：
     *  1、浏览器-后台管理页-游戏管理页-游戏添加/修改弹出框调用
     * <p>
     * 此接口会校验是否重复提交
     * @param gameVo 游戏参数对象
     */
    @Resubmit(message = "修改游戏")
    @RequestMapping("/update")
    @Auth(permit = "game:update")
    public Result<Object> updateGame(@RequestBody GameVo gameVo){
        log.info("开始修改游戏业务。{}", gameVo);
        if (gameVo.isUpdateParamsFail()) {
            log.info("修改游戏接口，请求参数错误");
            return Result.paramFail();
        }

        gameService.updateGame(gameVo);

        log.info("修改游戏业务结束");
        return Result.success();
    }

    /**
     * 修改游戏状态接口
     * <p>
     * 调用方：
     *  1、浏览器-后台管理页-游戏管理页调用
     * <p>
     * 此接口会校验是否重复提交
     * @param updateStatusVo 参数对象
     */
    @Resubmit(message = "修改游戏状态")
    @PostMapping("/update/status")
    @Auth(permit = "game:update")
    public Result<Object> updateGameStatus(@Validated @RequestBody UpdateStatusVo updateStatusVo) {
        log.info("开始修改游戏状态业务。{}", updateStatusVo);

        gameService.updateGameStatus(updateStatusVo);

        log.info("修改游戏状态业务结束");
        return Result.success();
    }



    /**
     * 删除游戏接口
     * <p>
     * 调用方：
     *  1、浏览器-后台管理页-游戏管理页调用
     * <p>
     * 此接口会校验是否重复提交
     * @param idList 游戏主键列表
     */
    @Resubmit(message = "删除游戏")
    @DeleteMapping("/delete")
    @Auth(permit = "game:delete")
    public Result<Object> deleteGame(@RequestBody List<Long> idList) {
        log.info("开始删除游戏业务。idList={}", idList);
        if (idList.isEmpty()) {
            log.info("删除游戏接口，请求参数错误");
            return Result.paramFail();
        }

        gameService.deleteGame(idList);

        log.info("删除游戏业务结束");
        return Result.success();
    }

    /**
     * 取消游戏默认奖品接口
     * <p>
     * 调用方：
     *  1、浏览器-后台管理页-游戏奖品管理页调用
     * <p>
     * 此接口会校验是否重复提交
     * @param defaultPrizeVo 参数对象
     * @return 新默认奖品主键
     */
    @Resubmit(message = "取消游戏默认奖品")
    @DeleteMapping("/delete/defaultPrize")
    @Auth(permit = "game:delete")
    public Result<String> deleteDefaultPrize(@RequestBody DefaultPrizeVo defaultPrizeVo) {
        log.info("开始取消游戏默认奖品业务。{}", defaultPrizeVo);
        if (defaultPrizeVo.isDeleteParamFail()) {
            log.info("取消游戏默认奖品接口，请求参数错误");
            return Result.paramFail();
        }

        gameService.updateDefaultPrize(defaultPrizeVo.getGameId(), CommonEnum.ZERO.getLongValue(),
                defaultPrizeVo.getOldPrizeId(), SecurityUtils.getUserId());

        log.info("取消游戏默认奖品业务结束");
        return Result.success(CommonEnum.ZERO.getStringValue());
    }

}
